package com.base.control;

import android.annotation.SuppressLint;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class ImageViewControl {
	private static final int NONE = 0;  
    private static final int DRAG = 1;  
    private static final int ZOOM = 2;  
  
    private int mode = NONE;  
    private float oldDist;  
    private Matrix matrix = new Matrix();  
    private Matrix savedMatrix = new Matrix();  
    private PointF start = new PointF();  
    private PointF mid = new PointF();  
    
    private ImageView imgView;
    
    public static void bingImageController(ImageView imgView) {
    	ImageViewControl ic = new ImageViewControl(imgView);
    	if(imgView != null)
    		ic.bind();
    }
    
    public ImageViewControl(ImageView imgView) {
		super();
		this.imgView = imgView;
	}


	@SuppressLint("ClickableViewAccessibility")
	public void bind() {
    	imgView.setOnTouchListener(new OnTouchListener()  
        {  
            @Override  
            public boolean onTouch(View v, MotionEvent event)  
            {
                ImageView view = (ImageView) v;
                switch (event.getAction() & MotionEvent.ACTION_MASK)  
                {  
                case MotionEvent.ACTION_DOWN:  
                    savedMatrix.set(matrix);  
                    start.set(event.getX(), event.getY());  
                    mode = DRAG;  
                    break;  
                case MotionEvent.ACTION_UP:  
                case MotionEvent.ACTION_POINTER_UP:  
                    mode = NONE;  
                    break;  
                case MotionEvent.ACTION_POINTER_DOWN:  
                    oldDist = spacing(event);  
                    if (oldDist > 10f)  
                    {  
                        savedMatrix.set(matrix);  
                        midPoint(mid, event);  
                        mode = ZOOM;  
                    }  
                    break;  
                case MotionEvent.ACTION_MOVE:  
                    if (mode == DRAG)  
                    {  
                        matrix.set(savedMatrix);  
                        matrix.postTranslate(event.getX() - start.x,  
                                event.getY() - start.y);  
                    }  
                    else if (mode == ZOOM)  
                    {  
                        float newDist = spacing(event);  
                        if (newDist > 10f)  
                        {  
                            matrix.set(savedMatrix);  
                            float scale = newDist / oldDist;  
                            matrix.postScale(scale, scale, mid.x, mid.y);  
                        }  
                    }  
                    break;  
                }  
                // 图片设置矩阵  
                view.setImageMatrix(matrix);  
                return true;  
            }  
  
            private float spacing(MotionEvent event)  
            {  
                float x = event.getX(0) - event.getX(1);  
                float y = event.getY(0) - event.getY(1);  
                return (float) Math.sqrt(x * x + y * y);  
            }  
  
            private void midPoint(PointF point, MotionEvent event)  
            {  
                float x = event.getX(0) + event.getX(1);  
                float y = event.getY(0) + event.getY(1);  
                point.set(x / 2, y / 2);  
            }  
        }); 
    }
}
